package com.changgou.goods.service.impl;

import com.alibaba.fastjson.JSON;
import com.changgou.goods.dao.*;
import com.changgou.goods.pojo.*;
import com.changgou.goods.service.SpuService;
import com.changgou.util.IdWorker;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import tk.mybatis.mapper.entity.Example;

import java.util.Date;
import java.util.List;
import java.util.Map;

@Service
public class SpuServiceImpl implements SpuService {

    @Autowired
    private SpuMapper spuMapper;

    @Autowired
    private IdWorker idWorker;

    @Autowired
    private BrandMapper brandMapper;

    @Autowired
    private CategoryMapper categoryMapper;

    @Autowired
    private SkuMapper skuMapper;

    @Autowired
    private BrandCategoryMapper brandCategoryMapper;

    /**
     * 查询全部列表
     * @return
     */
    @Override
    public List<Spu> findAll() {
        return spuMapper.selectAll();
    }

    /**
     * 根据ID查询
     * @param id
     * @return
     */
    @Override
    public Goods findGoodsById(String id){

        Goods goods = new Goods();

        /**
         * 查询spu信息
         */
        Spu spu = spuMapper.selectByPrimaryKey(id);
        goods.setSpu(spu);
        /**
         * 查询 sku 信息
         */
        Example example = new Example(Sku.class);
        Example.Criteria criteria = example.createCriteria();
        criteria.andEqualTo("spuId",id);
        List<Sku> skuList = skuMapper.selectByExample(example);
        goods.setSkuList(skuList);

        return  goods;
    }


    /**
     * 增加
     * @param goods
     */
    @Override
    @Transactional
    public void add(Goods goods){
        Spu spu = goods.getSpu();
        //设置  生成的id
        spu.setId(String.valueOf(idWorker.nextId()));
        //设置是否删除状态
        spu.setIsDelete("0");
        //设置是否上架状态
        spu.setIsMarketable("0");
        //设置审核状态
        spu.setStatus("0");
        //插入数据库
        /**
         * insertSelective 与 insert 的区别
         * 1、selective的意思是：选择性
         *
         * 2、insertSelective--选择性保存数据(通俗点儿就是说你需要什么字段,他就会对应的插入哪个字段)； 比如User里面有三个字段:id，name，age，password 但是我只设置了一个字段； User u=new user(); u.setName（"张三"）； insertSelective（u）；
         *
         * 3、insertSelective执行对应的sql语句的时候，只插入对应的name字段；（主键是自动添加的，默认插入为空） insert into tb_user （id，name） value （null，"张三"）；
         *
         * 4、而insert则是不论你设置多少个字段，统一都要添加一遍，不论你设置几个字段，即使是一个。 User u=new user(); u.setName（"张三"）； insertSelective（u）； insert into tb_user （id，name，age，password） value （null，"张三"，null，null）；
         */
        spuMapper.insertSelective(spu);

        //添加sku信息
        saveSkuList(goods);

    }

    //添加 sku信息
    public void saveSkuList(Goods goods){
        //获取 spu
        Spu spu = goods.getSpu();

        //获取sku集合对象
        List<Sku> skuList = goods.getSkuList();
        //判断是否 传入了 skuList
        if (skuList != null){
            for (Sku sku : skuList) {
                //设置 sku的id值
                sku.setId(String.valueOf(idWorker.nextId()));
                //设置 spu的id值
                sku.setSpuId(spu.getId());
                //设置创建时间 和 更新时间
                sku.setCreateTime(new Date());
                sku.setUpdateTime(new Date());
                //设置品牌名称
                Brand brand = brandMapper.selectByPrimaryKey(spu.getBrandId());
                sku.setBrandName(brand.getName());
                //设置 商品分类 id
                sku.setCategoryId(spu.getCategory3Id());

                /**
                 * 添加分类与品牌之间的关联
                 */
                BrandCategory brandCategory = new BrandCategory();
                brandCategory.setBrand_id(spu.getBrandId());
                brandCategory.setCategory_id(spu.getCategory3Id());
                int count = brandCategoryMapper.selectCount(brandCategory);
                //判断是否有这个品牌和分类的关系数据
                if (count == 0){
                    //如果没有关系数据，则添加品牌与分类的关系数据
                    brandCategoryMapper.insert(brandCategory);
                }


                //设置商品分类 名称
                Category category = categoryMapper.selectByPrimaryKey(spu.getCategory3Id());
                sku.setCategoryName(category.getName());
                //设置 sku 规格,若 无规格信息，默认 传入为空
                if (StringUtils.isEmpty(sku.getSpec())){
                    sku.setSpec("{}");
                }
                //若有规格信息，用 JSON 转换成 Map 信息,用于 设置 sku的名称
                //设置 sku 名称
                String name = spu.getName();
                Map<String,String> specMap = JSON.parseObject(sku.getSpec(), Map.class);
                if (specMap != null && specMap.size() > 0){
                    for (String value : specMap.values()) {
                        name+= " " + value;
                    }
                }
                sku.setName(name);

                skuMapper.insertSelective(sku);
            }
        }


    }


    /**
     * 修改
     * @param goods
     */
    @Transactional
    @Override
    public void update(Goods goods){
        /**
         * spu 进行信息的更新，sku 先删除，再插入
         */
        Spu spu = goods.getSpu();
        spuMapper.updateByPrimaryKey(spu);

        //进行 sku的删除
        Example example = new Example(Sku.class);
        Example.Criteria criteria = example.createCriteria();
        criteria.andEqualTo("spuId",spu.getId());
        skuMapper.deleteByExample(example);

        //进行sku 信息的插入
        saveSkuList(goods);


    }

    /**
     * 删除
     * @param id
     */
    @Override
    @Transactional
    public String delete(String id){
        Spu spu = spuMapper.selectByPrimaryKey(id);
        //判断商品是否存在
        if (spu == null){
            return "商品信息不存在";
        }
        //判断商品是否已经删除
        if ("1".equals(spu.getIsDelete())){
            return "商品信息已经删除，可在回收站进行还原";
        }
        spu.setIsDelete("1");
        spuMapper.updateByPrimaryKeySelective(spu);
        return "商品信息删除成功，可在回收站进行还原";
    }

    /**
     * 逻辑删除后，商品信息的还原，回收站信息的还原
     * @param id
     * @return
     */
    @Override
    @Transactional
    public String restore(String id) {
        Spu spu = spuMapper.selectByPrimaryKey(id);
        //判断商品是否存在
        if (spu == null){
            return "商品信息不存在";
        }
        //判断商品是否已经还原
        if ("0".equals(spu.getIsDelete())){
            return "商品信息未删除";
        }
        //设置商品信息，为 未删除 状态
        spu.setIsDelete("0");
        spuMapper.updateByPrimaryKeySelective(spu);
        return "商品信息还原成功";
    }

    /**
     * 对数据库中的商品信息，进行物理删除
     * @param id
     * @return
     */
    @Override
    @Transactional
    public String realDel(String id) {
        Spu spu = spuMapper.selectByPrimaryKey(id);
        //判断商品信息是否存在
        if (spu == null){
            return "商品信息不存在";
        }
        //判断商品信息是否已经逻辑删除
        if ("0".equals(spu.getIsDelete())){
            return "商品信息未删除";
        }
        //进行物理删除
        spuMapper.deleteByPrimaryKey(id);
        return "商品信息删除成功";
    }


    /**
     * 条件查询
     * @param searchMap
     * @return
     */
    @Override
    public List<Spu> findList(Map<String, Object> searchMap){
        Example example = createExample(searchMap);
        return spuMapper.selectByExample(example);
    }

    /**
     * 分页查询
     * @param page
     * @param size
     * @return
     */
    @Override
    public Page<Spu> findPage(int page, int size){
        PageHelper.startPage(page,size);
        return (Page<Spu>)spuMapper.selectAll();
    }

    /**
     * 条件+分页查询
     * @param searchMap 查询条件
     * @param page 页码
     * @param size 页大小
     * @return 分页结果
     */
    @Override
    public Page<Spu> findPage(Map<String,Object> searchMap, int page, int size){
        PageHelper.startPage(page,size);
        Example example = createExample(searchMap);
        return (Page<Spu>)spuMapper.selectByExample(example);
    }

    /**
     * 商品审核，审核通过并自动上架
     * @param id
     */
    @Override
    @Transactional
    public String audit(String id) {
        Spu spu = spuMapper.selectByPrimaryKey(id);
        //判断商品是否存在
        if (spu == null){
            return "商品信息不存在";
        }
        //判断商品是否为删除状态
        if ("1".equals(spu.getIsDelete())){
            return "商品信息处于已删除状态";
        }
        //判断商品是否已经审核
        if ("1".equals(spu.getStatus())){
            return "商品信息已经审核";
        }
        //修改商品的审核状态
        spu.setStatus("1");
        //修改商品的上架状态
        spu.setIsMarketable("1");

        spuMapper.updateByPrimaryKeySelective(spu);
        return "商品审核成功，并已经上架";

    }

    /**
     * 商品下架  1  上架，  0  下架
     * @param id
     */
    @Override
    @Transactional
    public String pull(String id) {
        Spu spu = spuMapper.selectByPrimaryKey(id);
        //判断商品是否存在
        if (spu == null){
            return "商品信息不存在";
        }
        //判断商品是否为已删除状态
        if ("1".equals(spu.getIsDelete())){
            return "商品信息处于已删除状态";
        }
        //判断商品是否已经下架
        if (!"1".equals(spu.getIsMarketable())){
            return "商品信息已经下架";
        }
        //设置 商品 为 已下架状态
        spu.setIsMarketable("0");
        //设置 商品 为 未审核状态
//        spu.setStatus("0");

        spuMapper.updateByPrimaryKeySelective(spu);
        return "商品信息下架成功";
    }

    /**
     * 商品上架
     * @param id
     */
    @Override
    @Transactional
    public String put(String id) {
        Spu spu = spuMapper.selectByPrimaryKey(id);
        //商品是否存在
        if (spu == null){
            return "商品信息不存在";
        }
        //判断商品是否处于删除状态
        if ("1".equals(spu.getIsDelete())){
            return "商品信息处于已删除状态";
        }
        //商品是否处于已审核状态
        if (!"1".equals(spu.getStatus())){
            return "商品信息处于未审核状态";
        }
        //判断商品是否已经下架
        if ("1".equals(spu.getIsMarketable())){
            return "商品信息已经处于上架状态";
        }
        //商品已审核，修改商品状态为上架
        spu.setIsMarketable("1");
        //执行操作
        spuMapper.updateByPrimaryKeySelective(spu);
        return "商品信息上架成功";
    }

    /**
     * 构建查询对象
     * @param searchMap
     * @return
     */
    private Example createExample(Map<String, Object> searchMap){
        Example example=new Example(Spu.class);
        Example.Criteria criteria = example.createCriteria();
        if(searchMap!=null){
            // 主键
            if(searchMap.get("id")!=null && !"".equals(searchMap.get("id"))){
                criteria.andEqualTo("id",searchMap.get("id"));
           	}
            // 货号
            if(searchMap.get("sn")!=null && !"".equals(searchMap.get("sn"))){
                criteria.andEqualTo("sn",searchMap.get("sn"));
           	}
            // SPU名
            if(searchMap.get("name")!=null && !"".equals(searchMap.get("name"))){
                criteria.andLike("name","%"+searchMap.get("name")+"%");
           	}
            // 副标题
            if(searchMap.get("caption")!=null && !"".equals(searchMap.get("caption"))){
                criteria.andLike("caption","%"+searchMap.get("caption")+"%");
           	}
            // 图片
            if(searchMap.get("image")!=null && !"".equals(searchMap.get("image"))){
                criteria.andLike("image","%"+searchMap.get("image")+"%");
           	}
            // 图片列表
            if(searchMap.get("images")!=null && !"".equals(searchMap.get("images"))){
                criteria.andLike("images","%"+searchMap.get("images")+"%");
           	}
            // 售后服务
            if(searchMap.get("saleService")!=null && !"".equals(searchMap.get("saleService"))){
                criteria.andLike("saleService","%"+searchMap.get("saleService")+"%");
           	}
            // 介绍
            if(searchMap.get("introduction")!=null && !"".equals(searchMap.get("introduction"))){
                criteria.andLike("introduction","%"+searchMap.get("introduction")+"%");
           	}
            // 规格列表
            if(searchMap.get("specItems")!=null && !"".equals(searchMap.get("specItems"))){
                criteria.andLike("specItems","%"+searchMap.get("specItems")+"%");
           	}
            // 参数列表
            if(searchMap.get("paraItems")!=null && !"".equals(searchMap.get("paraItems"))){
                criteria.andLike("paraItems","%"+searchMap.get("paraItems")+"%");
           	}
            // 是否上架
            if(searchMap.get("isMarketable")!=null && !"".equals(searchMap.get("isMarketable"))){
                criteria.andEqualTo("isMarketable",searchMap.get("isMarketable"));
           	}
            // 是否启用规格
            if(searchMap.get("isEnableSpec")!=null && !"".equals(searchMap.get("isEnableSpec"))){
                criteria.andEqualTo("isEnableSpec", searchMap.get("isEnableSpec"));
           	}
            // 是否删除
            if(searchMap.get("isDelete")!=null && !"".equals(searchMap.get("isDelete"))){
                criteria.andEqualTo("isDelete",searchMap.get("isDelete"));
           	}
            // 审核状态
            if(searchMap.get("status")!=null && !"".equals(searchMap.get("status"))){
                criteria.andEqualTo("status",searchMap.get("status"));
           	}

            // 品牌ID
            if(searchMap.get("brandId")!=null ){
                criteria.andEqualTo("brandId",searchMap.get("brandId"));
            }
            // 一级分类
            if(searchMap.get("category1Id")!=null ){
                criteria.andEqualTo("category1Id",searchMap.get("category1Id"));
            }
            // 二级分类
            if(searchMap.get("category2Id")!=null ){
                criteria.andEqualTo("category2Id",searchMap.get("category2Id"));
            }
            // 三级分类
            if(searchMap.get("category3Id")!=null ){
                criteria.andEqualTo("category3Id",searchMap.get("category3Id"));
            }
            // 模板ID
            if(searchMap.get("templateId")!=null ){
                criteria.andEqualTo("templateId",searchMap.get("templateId"));
            }
            // 运费模板id
            if(searchMap.get("freightId")!=null ){
                criteria.andEqualTo("freightId",searchMap.get("freightId"));
            }
            // 销量
            if(searchMap.get("saleNum")!=null ){
                criteria.andEqualTo("saleNum",searchMap.get("saleNum"));
            }
            // 评论数
            if(searchMap.get("commentNum")!=null ){
                criteria.andEqualTo("commentNum",searchMap.get("commentNum"));
            }

        }
        return example;
    }


    /**
     * 根据 spuId 进行spu 的查询
     * @param spuId
     * @return
     */
    @Override
    public Spu findBySpuId(String spuId){
        Spu spu = spuMapper.selectByPrimaryKey(spuId);
        return spu;
    }

}
